import os
import subprocess
import json
from pymongo.errors import ConnectionFailure, DuplicateKeyError
from config.config import Config
from config.log_config import get_logger
from utils.mongo_utils import get_arkts_collection

JS_SCRIPT_PATH = "extract_functions.js"
TARGET_DIRECTORY = Config.ARKTS_ROOT_DIR

logger = get_logger()

def run_js_extractor(target_dir: str):
    """
    运行 Node.js 脚本来提取函数。
    """
    logger.info(f"正在运行 JS 脚本，目标目录: {target_dir}...")
    try:
        # 使用 subprocess.run 来执行 node 命令
        # check=True 表示如果命令返回非零退出码（即出错），则抛出 CalledProcessError
        result = subprocess.run(
            ["node", JS_SCRIPT_PATH, target_dir],
            check=True,
            capture_output=True,
            text=True,
            encoding='utf-8'
        )
        logger.info("JS 脚本运行成功！")
        logger.info(f"JS 输出:{result.stdout}", )
    except FileNotFoundError:
        logger.error(f"错误: 未找到 'node' 命令。请确保 Node.js 已安装并添加到系统 PATH。")
        exit(1)
    except subprocess.CalledProcessError as e:
        logger.info(f"JS 脚本运行失败，退出码: {e.returncode}")
        logger.error(f"错误输出:\n{e.stderr}")
        exit(1)


def store_in_mongodb(json_file_path: str):
    """
    读取 JSON 文件并将其内容插入到 MongoDB 中。
    """
    if not os.path.exists(json_file_path):
        logger.info(f"错误: JSON 文件未找到: {json_file_path}")
        return

    logger.info(f"正在从 {json_file_path} 读取数据...")
    try:
        with open(json_file_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
    except json.JSONDecodeError:
        logger.error("错误: 无法解析 JSON 文件。")
        return

    functions_to_insert = data.get("functions", [])
    if not functions_to_insert:
        logger.warning("JSON 文件中没有找到函数数据，无需插入。")
        return

    logger.info(f"成功读取 {len(functions_to_insert)} 个函数。正在连接到 MongoDB...")

    try:
        arkts_collection = get_arkts_collection()
        logger.info(f"清空集合 '{Config.ArkTS_COLLECTION}'...")
        arkts_collection.delete_many({})

        logger.info(f"正在将 {len(functions_to_insert)} 个函数插入到集合 '{Config.ArkTS_COLLECTION}' 中...")
        arkts_collection.insert_many(functions_to_insert)

        logger.info("数据成功插入 MongoDB！")

    except ConnectionFailure:
        logger.error("错误: 无法连接到 MongoDB。请检查服务是否运行以及连接字符串是否正确。")
    except DuplicateKeyError:
        # 如果你的数据有 _id 并且重复了，会触发这个错误
        logger.error("错误: 插入数据时遇到主键冲突。")
    except Exception as e:
        logger.error(f"发生未知错误: {e}")


def extract_functions():
    """
    主函数，协调整个流程。
    """
    # 1. 运行 JS 脚本
    run_js_extractor(TARGET_DIRECTORY)
    json_output_path = os.path.join(os.path.dirname(JS_SCRIPT_PATH), "extracted_functions.json")
    # 3. 将 JSON 数据存入 MongoDB
    store_in_mongodb(json_output_path)
    logger.info("ArkTS包解析函数完成！")

if __name__ == '__main__':
    extract_functions()

